/*
 *  Copyright (C) void Team 2010 Pedro Batista
 * 
 *  http://code.google.com/p/capacitec
 * 
 *  This file is part of capacitec.
 * 
 *  capacitec is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 * 
 *  capacitec is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 * 
 *  You should have received a copy of the GNU General Public License
 *  along with capacitec.  If not, see <http://www.gnu.org/licenses/>.
 */
package controller;

import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import dao.AlunoSubProgramaDao;
import dao.CoordenadorDao;
import dao.ProgramaDao;
import dao.SubProgramaDao;
import entidades.AlunoSubPrograma;
import entidades.AlunoSubProgramaPK;
import entidades.SubPrograma;
import java.util.List;
import seguranca.anotacoes.RestritoAdministrador;
import seguranca.anotacoes.RestritoAluno;
import seguranca.Usuario;
import seguranca.anotacoes.RestritoCoordenador;
import util.ProgramaECoordenador;

/**
 *
 * @author pedro
 */
@Resource
public class SubProgramaController {

	private final SubProgramaDao subProgramaDao;
	private final ProgramaDao programaDao;
	private final AlunoSubProgramaDao alunoSubProgramaDao;
	private final CoordenadorDao coordeandorDao;
	private final Usuario usuario;
	private final Result result;

	/**
	 *
	 * @param subProgramaDao
	 * @param programaDao
	 * @param alunoSubProgramaDao
	 * @param coordeandorDao
	 * @param usuario
	 * @param result
	 */
	public SubProgramaController(SubProgramaDao subProgramaDao, ProgramaDao programaDao, AlunoSubProgramaDao alunoSubProgramaDao, CoordenadorDao coordeandorDao, Usuario usuario, Result result) {
		this.subProgramaDao = subProgramaDao;
		this.programaDao = programaDao;
		this.alunoSubProgramaDao = alunoSubProgramaDao;
		this.coordeandorDao = coordeandorDao;
		this.usuario = usuario;
		this.result = result;
	}

	/**
	 * Formulário para cadastro de subprograma.
	 * @return Dados de programa e coordenador para serem adicionados a lista de escolha do formulário.
	 */
	@Get
	@Path("/subprograma/novo")
	@RestritoAdministrador
	public ProgramaECoordenador formulario() {
		//TODO: Adicionar mascara para número de vagas
		//TODO: Adicionar válidação de campos (JavaScript)
		return new ProgramaECoordenador(programaDao.carrega(), coordeandorDao.carrega());
	}

	/**
	 * Adiciona novo subprograma ao banco, e caso sucesso redireciona para a index.
	 * @param subPrograma subprograma a ser adicionado.
	 */
	@Post
	@Path("/subprograma")
	@RestritoAdministrador
	public void adiciona(SubPrograma subPrograma) {
		subProgramaDao.salva(subPrograma);
		result.redirectTo(HomeController.class).index();
	}

	/**
	 * Mostra os subprogramas disponíveis.
	 * @return Lista contendo todos os subprogramas.
	 */
	@Get
	@Path("/subprograma/listaTodos")
	public List<SubPrograma> listaTodos() {
		//TODO: brincar para poder filtrar por programa
		//TODO: mostrar para o usuario quais os subprogramas ele esta aceito/candidatado.
		List<SubPrograma> lista = subProgramaDao.carrega();
		//TODO: achar solução: muito feio
		for (SubPrograma subPrograma : lista) {
			subProgramaDao.recarrega(subPrograma);
		}
		return lista;
	}

	@Get
	@Path("/subprograma/listaAbertos")
	public List<SubPrograma> listaAbertos() {
		List<SubPrograma> lista = subProgramaDao.carregaAbertos();
		//for (SubPrograma subPrograma : lista)
		//	subProgramaDao.recarrega(subPrograma);
		return lista;
	}

	/**
	 * Adicionar aluno atualmente logado a fila de seleção de um
	 * subprograma, caso sucesso redireciona para página de lista
	 * de subprogramas. Este terá o status de "avaliando".
	 * @param subProgramaId subprograma ao qual o aluno se candidatará.
	 */
	@Get
	@Path("/subprograma/candidatar/{subProgramaId}")
	@RestritoAluno
	public void candidatar(Integer subProgramaId) throws Exception {
		AlunoSubPrograma alunoSubPrograma =
			new AlunoSubPrograma(
			new AlunoSubProgramaPK(
			usuario.getPessoa().getId(),
			subProgramaId),
			"avaliando");
		alunoSubProgramaDao.salva(alunoSubPrograma);
		//TODO: redirecionar pra uma página "melhor".
		result.redirectTo(SubProgramaController.class).listaTodos();
	}

	/**
	 * Página para mostrar dados detalhados de um subprograma.
	 * @param subProgramaId id do subprograma a ser mostrado.
	 * @return dados do subprograma recarregados do banco.
	 */
	@Get
	@Path("/subprograma/{subProgramaId}")
	public SubPrograma visualiza(Integer subProgramaId) {
		return subProgramaDao.carrega(subProgramaId);
	}

	/**
	 * Seta o estado do subprograma para 'em_andamento'.
	 * @param subProgramaId subprograma a ser setado situação para em_andamento.
	 * @exception Caso o coordenador logado não seja dono do subprograma.
	 */
	@Post
	@Path("/subprograma/emAndamento/{subProgramaId}")
	@RestritoCoordenador
	public void emAndamento(Integer subProgramaId) throws Exception {
		SubPrograma subPrograma = subProgramaDao.carrega(subProgramaId);
		if (!usuario.getPessoa().getId().equals(subPrograma.getCoordenador().getPessoaId())) {
			throw new Exception("Erro: você não é coordenador deste subprograma.");
		}
		subPrograma.setSituacao("em_andamento");
		subProgramaDao.atualiza(subPrograma);
		result.redirectTo(AvaliaController.class).avalia();
	}
}
